package git.soulbgm.utils;

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * Zip工具类
 *
 * @author SoulBGM
 * @date 2024/02/20
 */
public class ZipUtil {

    /**
     * 压缩文件
     *
     * @param outputStream 输出流
     * @param inputFile    输入文件
     */
    public static void zip(OutputStream outputStream, File... inputFile) throws IOException {
        try (ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream)) {
            zip(zipOutputStream, "", inputFile);
        }
    }

    /**
     * 压缩文件
     *
     * @param zipFileName zip文件的名字
     * @param inputFile   输入文件
     * @return {@link InputStream}
     */
    public static InputStream zip(String zipFileName, File... inputFile) {
        File zipFile = new File(zipFileName);
        try (
                FileOutputStream fileOutputStream = new FileOutputStream(zipFile);
                ZipOutputStream zipOutputStream = new ZipOutputStream(fileOutputStream);
                FileInputStream fileInputStream = new FileInputStream(zipFile)
        ) {
            zip(zipOutputStream, "", inputFile);
            return fileInputStream;
        } catch (IOException e) {
            //e.printStackTrace();
            return null;
        }
    }

    /**
     * 压缩文件
     *
     * @param out   出
     * @param base  基地
     * @param files 文件
     * @throws IOException ioexception
     */
    public static void zip(ZipOutputStream out, String base, File... files) throws IOException {
        for (File f : files) {
            // 测试此抽象路径名表示的文件是否是一个目录
            if (f.isDirectory()) {
                // 获取路径数组
                File[] fileList = f.listFiles();
                if (fileList == null) {
                    return;
                }
                if (!"".equals(base)) {
                    // 写入此目录的entry
                    ZipEntry e = new ZipEntry(base + "/");
                    out.putNextEntry(e);
                }
                // 判断参数是否为空
                base = base.length() == 0 ? "" : base + "/";
                // 循环遍历数组中文件
                for (File file : fileList) {
                    zip(out, base + file.getName(), file);
                }
            } else {
                // 创建新的进入点
                ZipEntry e = new ZipEntry("".equals(base) ? f.getName() : base);
                out.putNextEntry(e);
                // 创建FileInputStream对象
                try (FileInputStream in = new FileInputStream(f)) {
                    int b;
                    // 如果没有到达流的尾部
                    while ((b = in.read()) != -1) {
                        // 将字节写入当前ZIP条目
                        out.write(b);
                    }
                }
            }
        }
    }

}
